<?php
namespace libs\qoy\DB;
use PDO;
use PDOException;
use libs\qoy\Exception\ExceptionInternalServerError;

/**
 * MysqlNotORM 分布式的DB存储
 *
 * 基于MysqlNotORM的数据库操作，支持分布式
 * 
 * - 可定义每个表的存储路由和规则，匹配顺序：
 *   自定义区间匹配 -> 自定义缺省匹配 -> 默认区间匹配 -> 默认缺省匹配
 * - 底层依赖NotORM实现数据库的操作
 * 
 * <br>使用示例：<br>
 *
 *      $notorm = new MysqlNotORM($config);
 *
 *      //根据ID对3取模的映射获取数据
 *      $rs = $notorm->demo_0->select('*')->where('id', 10)->fetch();
 *      $rs = $notorm->demo_1->select('*')->where('id', 11)->fetch();
 *
 * @param array $configs 数据库配置 
 * @param array $configs["servers"] 可用的DB服务器集群
 * @param array $configs["servers"]["*"] 可用的DB服务器集群对象配置
 * @param array $configs["servers"]["*"]["host"] 数据库域名
 * @param array $configs["servers"]["*"]["name"] 数据库名字
 * @param array $configs["servers"]["*"]["user"] 数据库用户名
 * @param array $configs["servers"]["*"]["password"] 数据库密码
 * @param array $configs["servers"]["*"]["port"] 数据库端口
 * @param array $configs["servers"]["*"]["charset"] 数据库字符集
 * @param array $configs["tables"] 表路由
 * @param array $configs["tables"]['*'] 表路由项
 * @param array $configs["tables"]["*"]["prefix"] 表前缀
 * @param array $configs["tables"]["*"]["key"] 区间key
 * @param array $configs["tables"]["*"]["map"] 表路由map
 * @param array $configs["tables"]["*"]["map"]["*"] 区间
 * @param array $configs["tables"]["*"]["map"]["*"]["start"] 区间
 * @param array $configs["tables"]["*"]["map"]["*"]["end"] 区间
 * @param array $configs["tables"]["*"]["map"]["*"]["db"] 区间
 * @param boolean $configs['debug'] 是否开启调试模式
 */
class MysqlNotORM extends DBNotORM {

    
    /**
     * 针对MySQL的PDO链接，如果需要采用其他数据库，可重载此函数
     * @param array $dbCfg 数据库配置
     * @return PDO
     */
    protected function createPDOBy($dbCfg) {
        
        $dsn = sprintf('mysql:dbname=%s;host=%s;port=%d', $dbCfg['name'], isset($dbCfg['host']) ? $dbCfg['host'] : 'localhost', isset($dbCfg['port']) ? $dbCfg['port'] : 3306
        );
        $charset = isset($dbCfg['charset']) ? $dbCfg['charset'] : 'UTF8';
        try {
             $pdo = new PDO($dsn, $dbCfg['user'], $dbCfg['password']);
        } catch (PDOException $exc) {
            throw new ExceptionInternalServerError(ExceptionInternalServerError::Database_connection_error);
        }
        
       
        $pdo->exec("SET NAMES '{$charset}'");
        return $pdo;
    }


}
